// object  表示一个js对象
let a:object;
a={};
a=function(){

}

// {} 用来指定对象中可以包含哪些属性
// 语法：{属性名:属性值}
// let b:{name:string}
// b={name:"kevin",age:123} // 报错

// 要按照定义的类型
// let b:{name:string,age:number}
// b={name:'kevin',age:23}

// 属性可选
// let b:{name:string,age?:number}
// b={name:'kevin'}

// 如果属性不确定,[]里面内容任意定义，propName代表的是属性名是字符串,any标示属性值是任意类型
let c:{name:string,[propName:string]:any}
c={name:'kevin',age:12,height:165}


// 设置函数结构类型说明
// 语法：(形参:类型,形参:类型)=>返回值类型
let d:(a:number,b:number)=>number;
d=(a,b)=>{
    return a+b;
}
d(1,2);

// 数组array
let e:number[];// 表示数字数组，里面存的都是数字
e=[1,2,3];  
let g:Array<number>;// 表示数字数组，里面存的都是数字
g=[1,2,3];

// 元祖 固定长度的数组
// 语法：[类型,类型,类型]
let h:[string,number];
// h=['hello',123,555]; // 报错
h=['hello',123]

// 枚举
// let i:{name:string,gender:string};
// i={
//     name:'kevin',
//     gender:'male'
// }

// console.log(i.gender==='male');

enum Gender{
    Male,
    Female
}

let i:{name:string,gender:Gender};
i={
    name:'kevin',
    gender:Gender.Male,// 枚举的值只能是male或者female
}

console.log(i.gender===Gender.Male);


// & 表示同时
let j :{name:string}&{age:number};
j={name:'kevin',age:12}


// 类型别名
// 这样就麻烦
// let k:1|2|3;
// let l:1|2|3;

// 使用类型别名
type myType=1|2|3;
let k:myType;
let l:myType;